﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace EXT
{
    class clsGiautinTronganh
    {
        private static string key = "webchatluong.com";
        public static Bitmap hideMessageIntoBitmap(string message, Bitmap b)
        {
            // giấu key            
            for (int i = 0; i < key.Length; i++)
            {
                hideByteIntoPixel((byte)key[i], i, 0, b);
            }


            // giấu length
            int l1 = message.Length / 256;
            int l2 = message.Length % 256;
            hideByteIntoPixel((byte)l1, key.Length, 0, b);
            hideByteIntoPixel((byte)l2, key.Length + 1, 0, b);


            // tính bước nhảy
            int t = (b.Width * b.Height - 2 - key.Length) / message.Length;
            if (t >= 1)
            {
                int x = key.Length + 2;
                int y = 0;


                // giấu thông điệp
                for (int i = 0; i < message.Length; i++)
                {
                    if (x > b.Width)
                    {
                        y = y + x / b.Width;
                        x = x % b.Width;
                    }


                    hideByteIntoPixel((byte)message[i], x, y, b);
                    x += t;
                }
            }


            return b;
        }
        public static Bitmap hideByteIntoPixel(byte asscii, int x, int y, Bitmap b)
        {
            Color c = b.GetPixel(x, y);
            b.SetPixel(x, y, Color.FromArgb(c.R, asscii, c.B));
            return b;
        }


        public static string showMessageFromBitmap(Bitmap b, out bool error)
        {
            // check key
            for (int i = 0; i < key.Length; i++)
            {
                if ((byte)key[i] != showByteFromPitxel(b, i, 0))
                {
                    error = true;
                    return "";
                }
            }


            // get length
            byte l1 = showByteFromPitxel(b, key.Length, 0);
            byte l2 = showByteFromPitxel(b, key.Length + 1, 0);
            int length = l1 * 256 + l2;


            // tính bước nhảy
            int t = (b.Width * b.Height - 2 - key.Length) / length;


            int x = key.Length + 2;
            int y = 0;
            string message = "";


            // giấu thông điệp
            for (int i = 0; i < length; i++)
            {
                if (x > b.Width)
                {
                    y += x / b.Width;
                    x = x % b.Width;
                }


                message += ((char)showByteFromPitxel(b, x, y)).ToString();
                x += t;
            }


            error = false;
            return message;
        }
        public static byte showByteFromPitxel(Bitmap b, int x, int y)
        {
            Color c = b.GetPixel(x, y);
            return c.G;
        }
    }
}
